package Test_interface

import (
	"fmt"
	"reflect"
)

/*
反射的注意事项和细节
1）reflect.Value.Kind获取变量的类别，返回的是一个常量
2）Type和Kind的区别
Type是类型，Kind是类别，Type和Kind可能是相同的，也可能是不同的
比如：var num int type和kind都是int
var stu studet 的Type是package.Student,kind是Struct
3）通过反射可以让变量在interface{}和Reflect.Value之间相互转换
4）使用反射的方式来获取变量的值（并返回对应的类型）要求数据类型匹配，比如x是int，那么就应该使用reflect.ValueOf(x).Int()
不然会报错
5）通过反射来修改变量，注意当使用SrtXxx方法来设置需要通过对应的指针类型来完成，这样才能改变传入的变量的值，同时需要使用到reflect.Value.Elem()方法
6）reflect.Value.Elem()应该如何理解
Elem（）类似于用于获取变量的指针变量，来进行设置
 */
func reflectSetInt(num interface{}){
	val:=reflect.ValueOf(num)
	fmt.Println(val)
	val.Elem().SetInt(100)
	fmt.Println(val)
}
func Test4()  {
	a:=10
	reflectSetInt(&a)
	fmt.Println(a)
}